/** 
 * <p>Original Author:  jessefreeman</p>
 * <p>Class File: ArrayUtility.as
 * 
 * <p>Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:</p>
 * 
 * <p>The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.</p>
 * 
 * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.</p>
 * 
 * <p>Licensed under The MIT License</p>
 * <p>Redistributions of files must retain the above copyright notice.</p>
 *
 * <p>Revisions<br/> 
 * 	0.1  Initial version Nov 10, 2008</p>
 *
 */
 
 package camo.utils
{
	public class ArrayUtility
	{
		private static var __instance : ArrayUtility;
		
		/**
		 * 
		 * @return 
		 * 
		 */		
		public static function get instance() : ArrayUtility {
			if(ArrayUtility.__instance == null) {
				ArrayUtility.__instance = new ArrayUtility(new SingletonEnforcer());
			}
			return ArrayUtility.__instance;
		}
		
		/**
		 * 
		 * @param enforcer
		 * 
		 */		
		public function ArrayUtility(enforcer : SingletonEnforcer) {
			if (enforcer == null) {
				throw new Error("Error: Cannot instantiate ArrayUtility directly, use ArrayUtility.instance instead of new.");
			}
		}
		
		/**
		 * 
		 * @param startIndex
		 * @param endIndex
		 * @return 
		 * 
		 */		
		public function shuffle(source:Array, startIndex:int = 0, endIndex:int = 0):Array{ 
			
			var sourceClone:Array = source.slice();
			
			if(endIndex == 0) endIndex = sourceClone.length-1;
			for (var i:int = endIndex; i>startIndex; i--) {
				var randomNumber:int = Math.floor(Math.random()*endIndex)+startIndex;
				var tmp:* = sourceClone[i];
				sourceClone[i] = sourceClone[randomNumber];
				sourceClone[randomNumber] = tmp;
			}
			return sourceClone;
		}
		
		

	}
}

internal class SingletonEnforcer {
}